package photos_api

import (
	"software/global"
	"software/models/request"
	"software/models/res"
	"software/models/result"
	"software/service"
	"strconv"

	"github.com/gin-gonic/gin"
)

func (p PhotosApi) QueryTotalPhotos(c *gin.Context) {
	total, err := service.QueryTotalPhotos()
	if err != nil {
		res.FailWithMsg(err.Error(), c)
		return
	}
	res.OKWithData(gin.H{"total_photos": total}, c)
}

func (p PhotosApi) QueryPhotoById(c *gin.Context) {
	photoId := c.Param("id")

	photo, err := service.QueryPhotoById(photoId)
	if err != nil {
		res.FailWithMsg(err.Error(), c)
		return
	}

	res.OKWithData(photo, c)
}

func (p PhotosApi) QueryPhotoByUserId(c *gin.Context) {
	userId := c.Param("id")
	photos, err := service.QueryPhotoByUserId(userId)
	if err != nil {
		res.FailWithMsg(err.Error(), c)
		return
	}
	res.OKWithData(photos, c)

}

func (p PhotosApi) QueryPhotoByNew(c *gin.Context) {
	photos, err := service.QueryPhotoByNew()
	if err != nil {
		res.FailWithMsg(err.Error(), c)
		return
	}
	res.OKWithData(photos, c)
}

func (p PhotosApi) UpdatePhotoStatus(c *gin.Context) {
	var photo request.UpdateStatusRequest
	if err := c.ShouldBindJSON(&photo); err != nil {
		res.FailWithMsg("请求参数错误", c)
		return
	}

	// 检查 id 是否为空
	if photo.ID == "" || photo.Status == "" {
		res.FailWithMsg("缺少必要参数", c)
		return
	}

	// photoId 转换：string -> int
	idInt, err := strconv.Atoi(photo.ID)
	if err != nil {
		global.Log.Errorf("图片ID格式错误: %s, 错误详情: %v", photo.ID, err)
		res.FailWithMsg("无效的图片ID", c)
		return
	}

	// status 转换：string -> int
	statusInt, err := strconv.Atoi(photo.Status)
	if err != nil {
		global.Log.Errorf("状态值格式错误: %s, 错误详情: %v", photo.Status, err)
		res.FailWithMsg("无效的状态值", c)
		return
	}

	// 调用服务层更新状态
	err = service.UpdatePhotoStatus(c, idInt, statusInt)
	if err != nil {
		global.Log.Errorf("更新图片状态失败: %v", err)
		res.FailWithMsg(err.Error(), c)
		return
	}

	// 返回成功响应
	res.OK(c)
}

func (p PhotosApi) QueryPhotoList(c *gin.Context) {
	// 获取查询参数
	page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
	pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "10"))
	keyword := c.DefaultQuery("keyword", "")
	status := c.DefaultQuery("status", "") // 状态：0-审核中，1-正常，2-封禁

	// 参数验证
	if page < 1 {
		page = 1
	}
	if pageSize < 1 || pageSize > 100 {
		pageSize = 10
	}

	// 调用服务层查询
	photos, total, err := service.QueryPhotoList(page, pageSize, keyword, status)
	if err != nil {
		res.FailWithMsg(err.Error(), c)
		return
	}

	// 返回结果
	res.OKWithData(gin.H{
		"list":     photos,
		"total":    total,
		"page":     page,
		"pageSize": pageSize,
	}, c)
}

// AuditImage 审核指定ID的图片
func (p PhotosApi) AuditImage(c *gin.Context) {
	// 获取图片ID
	photoId := c.Param("id")
	if photoId == "" {
		res.FailWithMsg("缺少图片ID", c)
		return
	}

	// 查询图片信息
	photo, err := service.QueryPhotoById(photoId)
	if err != nil {
		res.FailWithMsg("图片不存在", c)
		return
	}

	// 获取图片URL
	imageURL, ok := photo["url"].(string)
	if !ok {
		res.FailWithMsg("图片URL格式错误", c)
		return
	}

	// 调用审核服务
	auditResult, err := service.AuditImage(imageURL)
	if err != nil {
		res.FailWithMsg(err.Error(), c)
		return
	}

	//// 根据审核结果更新图片状态
	//var status uint8 = 1 // 默认正常
	//if !auditResult.Passed {
	//	status = 0 // 审核中
	//}
	//
	//// 获取图片ID
	//photoIDUint, ok := photo["id"].(uint)
	//if !ok {
	//	res.FailWithMsg("图片ID格式错误", c)
	//	return
	//}

	//// 更新图片状态
	//err = service.UpdatePhotoStatus(c, photoIDUint, status)
	//if err != nil {
	//	global.Log.Errorf("更新图片状态失败: %v", err)
	//	// 即使更新状态失败，也返回审核结果
	//}

	// 返回审核结果
	res.OKWithData(auditResult, c)
}

// AsyncAuditImage 异步审核图片（接收URL或Base64）
func (p PhotosApi) AsyncAuditImage(c *gin.Context) {
	// 获取请求参数
	type AuditRequest struct {
		ImageURL    string `json:"image_url"`
		ImageBase64 string `json:"image_base64"`
	}

	var req AuditRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		res.FailWithMsg("请求参数错误", c)
		return
	}

	// 检查参数
	if req.ImageURL == "" /*&& req.ImageBase64 == ""*/ {
		res.FailWithMsg("请提供图片URL", c)
		return
	}

	// 根据提供的参数选择审核方式
	var auditResult *result.AuditResult
	var err error

	if req.ImageURL != "" {
		auditResult, err = service.AuditImage(req.ImageURL)
	}
	//} else {
	//	auditResult, err = service.AuditImageByBase64(req.ImageBase64)
	//}

	if err != nil {
		res.FailWithMsg(err.Error(), c)
		return
	}

	// 返回审核结果
	res.OKWithData(auditResult, c)
}

/**
 * 删除单个图片
 */
func (p PhotosApi) DeletePhotoById(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 64)
	if err != nil {
		res.FailWithMsg("无效的图片 ID", c)
		return
	}

	err = service.DeletePhotoById(uint(id))
	if err != nil {
		res.FailWithMsg(err.Error(), c)
		return
	}

	res.OKWithMsg("图片已成功删除", c)
}

// QueryCategoryStats 获取作品分类统计
func (p PhotosApi) QueryCategoryStats(c *gin.Context) {
	stats, err := service.QueryPhotoCategoryStats()
	if err != nil {
		res.FailWithMsg("获取分类统计失败: "+err.Error(), c)
		return
	}
	res.OKWithData(stats, c)
}

func (p PhotosApi) QueryTotalByStatus(c *gin.Context) {
	// 获取各状态的照片数量
	pendingWorks, err := service.QueryTotalByStatus(0) // 审核中(status=0)的照片
	if err != nil {
		res.FailWithMsg("获取审核中照片数量失败: "+err.Error(), c)
		return
	}

	publishedWorks, err := service.QueryTotalByStatus(1) // 已发布(status=1)的照片
	if err != nil {
		res.FailWithMsg("获取已发布照片数量失败: "+err.Error(), c)
		return
	}

	removedWorks, err := service.QueryTotalByStatus(2) // 已封禁(status=2)的照片
	if err != nil {
		res.FailWithMsg("获取已封禁照片数量失败: "+err.Error(), c)
		return
	}

	// 返回所有状态的照片计数
	res.OKWithData(gin.H{
		"pendingWorks":   pendingWorks,
		"publishedWorks": publishedWorks,
		"removedWorks":   removedWorks,
	}, c)
}
